/**
 * Copyright (C) 2011 Domenico Briganti <dometec@gmail.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.webrules.deploymanager.webapp.controller.aop;

import it.webrules.deploymanager.webapp.exception.DeployManagerRestException;
import it.webrules.deploymanager.webapp.utils.LogLevel;
import it.webrules.deploymanager.webapp.utils.LogUtils;

import javax.ws.rs.core.Response.Status;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ManageOutputException implements MethodInterceptor {

	private Logger logger = LoggerFactory.getLogger(LogUtils.formatClassName(this.getClass()));

	public Object invoke(MethodInvocation invocation) throws Throwable {

		try {

			return invocation.proceed();

		} catch (RuntimeException e) {

			if (e instanceof DeployManagerRestException) {

				LogLevel logLevel = LogLevel.error;

				DeployManagerRestException ex = (DeployManagerRestException) e;
				if (ex != null && ex.getLogLevel() != null)
					logLevel = ex.getLogLevel();

				String msg = "Chiamata anomala: " + e;

				switch (logLevel) {
				case trace:
					logger.trace(msg);
					break;
				case debug:
					logger.debug(msg);
					break;
				case info:
					logger.info(msg);
					break;
				case warn:
					logger.warn(msg, e);
					break;
				case error:
					logger.error(msg, e);
					break;
				}

				throw e;
			} else {
				logger.error("Unexpected Error!", e);
				throw new DeployManagerRestException(e.getLocalizedMessage(), Status.INTERNAL_SERVER_ERROR, 500, e);
			}

		}

	}

}